package com.master.rn;

import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;

import javax.servlet.http.HttpServletResponse;

import com.lowagie.text.Document;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfReader;
import com.master.bd.DuplicataRelBD;
import com.master.ed.DuplicataED;
import com.master.ed.DuplicataPesquisaED;
import com.master.ed.Tipo_EventoED;
import com.master.rl.JasperRL;
import com.master.util.Data;
import com.master.util.Excecoes;
import com.master.util.FileUtil;
import com.master.util.Mensagens;
import com.master.util.bd.Transacao;

public class DuplicataRelRN
    extends Transacao {

  public DuplicataRelRN () {
  }

  public byte[] geraRelTitVencUnidade (DuplicataED ed) throws Excecoes {

    try {
      this.inicioTransacao ();
      return new DuplicataRelBD (this.sql).geraRelTitVencUnidade (ed);
    }
    finally {
      this.fimTransacao (false);
    }
  }

  public byte[] geraRelTitulos (DuplicataED ed) throws Excecoes {

    try {
      this.inicioTransacao ();
      return new DuplicataRelBD (this.sql).geraRelTitulos (ed);
    }
    finally {
      this.fimTransacao (false);
    }
  }

  public ArrayList geraEdiRelTitulos (DuplicataED ed) throws Excecoes {

    try {
      this.inicioTransacao ();
      return new DuplicataRelBD (this.sql).geraEdiRelTitulos (ed);
    }
    finally {
      this.fimTransacao (false);
    }
  }
  public ArrayList geraEDITitLiquidadosCart (DuplicataED ed) throws Excecoes {

	    try {
	      this.inicioTransacao ();
	      return new DuplicataRelBD (this.sql).geraEDITitLiquidadosCart(ed);
	    }
	    finally {
	      this.fimTransacao (false);
	    }
	  }

  public byte[] geraDiario_Auxiliar_Clientes (DuplicataED ed) throws Excecoes {

    try {
      this.inicioTransacao ();

      byte[] b = new DuplicataRelBD (this.sql).geraDiario_Auxiliar_Clientes (ed);
      this.fimTransacao (true);
      return b;
    }
    catch (Excecoes exc) {
      this.abortaTransacao ();
      throw exc;
    }
    catch (RuntimeException e) {
      this.abortaTransacao ();
      throw e;
    }
  }

  public byte[] geraRelTitEmitidosPeriodo (DuplicataED ed) throws Excecoes {

    try {
      this.inicioTransacao ();
      return new DuplicataRelBD (this.sql).geraRelTitEmitidosPeriodo (ed);
    }
    finally {
      this.fimTransacao (false);
    }
  }

  public byte[] geraRelTitLiquidadosCart (DuplicataED ed) throws Excecoes {

    try {
      this.inicioTransacao ();
      return new DuplicataRelBD (this.sql).geraRelTitLiquidadosCart (ed);
    }
    finally {
      this.fimTransacao (false);
    }
  }

  public byte[] geraRelTitulosDespesaCobranca (DuplicataED ed) throws Excecoes {

    try {
      this.inicioTransacao ();
      return new DuplicataRelBD (this.sql).geraRelTitulosDespesaCobranca (ed);
    }
    finally {
      this.fimTransacao (false);
    }
  }

  public byte[] geraRelTitCliente (DuplicataPesquisaED ed) throws Excecoes {

    try {
      this.inicioTransacao ();
      return new DuplicataRelBD (this.sql).geraRelTitCliente (ed);
    }
    finally {
      this.fimTransacao (false);
    }
  }

  public byte[] geraRelFatura (DuplicataPesquisaED ed) throws Exception {
    byte [] b = null;
    this.inicioTransacao ();
    try {
      if ("2".equals (ed.getDM_Tipo_Documento ()) && "JASPER".equals (ed.getDM_Relatorio ())) {
        new DuplicataRelBD (this.sql).imprimeFatura (ed);
        return null;
      }
      else if ("1".equals (ed.getDM_Tipo_Documento ()) && "JASPER".equals (ed.getDM_Relatorio ())) {
        new DuplicataRelBD (this.sql).imprimeFaturaCto (ed);
        return null;
      }
      else if ("XSL".equals (ed.getDM_Relatorio ())) {
        return new DuplicataRelBD(this.sql).geraRelFatura(ed);
      }
      return b;
    }
    finally {
      this.fimTransacao (false);
    }
  }

  public byte[] geraDemonstrativo_Cobranca (DuplicataED ed) throws Excecoes {

	    try {
	      this.inicioTransacao ();
	      return new DuplicataRelBD (this.sql).geraDemonstrativo_Cobranca (ed);
	    }
	    finally {
	      this.fimTransacao (false);
	    }
  }


  public String imprime_Fatura_Matricial (DuplicataPesquisaED ed) throws Exception {
	  	try {
	      this.inicioTransacao ();
	      return new DuplicataRelBD (this.sql).imprime_Fatura_Matricial (ed);
	    }
	    finally {
	      this.fimTransacao (false);
	    }
  }

  public byte[] imprime_Fatura_PDF (DuplicataPesquisaED ed) throws Excecoes {
	  try {
		  this.inicioTransacao ();
		  return new DuplicataRelBD (this.sql).imprime_Fatura_PDF (ed);
	  }
	  finally {
		  this.fimTransacao (false);
	  }
  }

  public void geraProtocoloJasper (DuplicataPesquisaED ed) throws Exception {
	    this.inicioTransacao ();
	    try {
//	      new DuplicataRelBD (this.sql).ProtocoloJasper(ed);
	    	ed = new DuplicataRelBD (this.sql).ProtocoloDados(ed);
	    	ed.setNomeRelatorio("Protocolo_Cobranca_Jasper");

	    	new JasperRL (ed).geraRelatorioToFile("/data/miro/financeiro/tmp/#Protocolo_Cobranca"+ed.getOid_Duplicata()+".pdf");
	    	  System.out.println("gerou o arquivo... pelo RN!!!");
	    	  String arquivoSaida = "/data/miro/financeiro/tmp/Protocolo_Cobranca"+ed.getOid_Duplicata()+".pdf";
	    	  Iterator it = FileUtil.lista("/data/miro/financeiro/tmp/").iterator();
	    	  try{
	    		  Document doc = new Document();
		    	  PdfCopy copy = new PdfCopy(doc, new FileOutputStream(arquivoSaida));
		    	  doc.open();
		    	  PdfReader reader;
		    	  int n;
		    	  while(it.hasNext()){
		    		  String fl = "/data/miro/financeiro/tmp/"+(String)it.next();
					  reader = new PdfReader(fl);
					  n = reader.getNumberOfPages();
			          for (int page = 0; page < n; ) {
			        	  copy.addPage(copy.getImportedPage(reader, ++page));
			          }
			          copy.freeReader(reader);
		    	  }
		    	  doc.close();
	    	  } catch (Exception exc) {
	            Excecoes excecoes = new Excecoes();
	            excecoes.setClasse(this.getClass().getName());
	            excecoes.setMensagem("Erro ao juntar arquivo PDF");
	            excecoes.setMetodo("concatenaArquivos");
	            excecoes.setExc(exc);
	            throw excecoes;
	        }

	    }
	    finally {
	      this.fimTransacao (false);
	    }
	  }

  public void geraProtocoloExcell(DuplicataPesquisaED ed) throws Exception {
	    this.inicioTransacao ();
	    try {
	    	ed = new DuplicataRelBD (this.sql).ProtocoloDados(ed);
	    	ed.setNomeRelatorio("Protocolo_Cobranca_Excell");

	    	new JasperRL(ed).geraRelatorioXLS();

	    }
	    finally {
	      this.fimTransacao (false);
	    }
	  }

  public DuplicataPesquisaED getProtocoloDados (DuplicataPesquisaED ed) throws Exception {
	    this.inicioTransacao ();
	    try {
	    	return new DuplicataRelBD (this.sql).ProtocoloDados(ed);

	    }
	    finally {
	      this.fimTransacao (false);
	    }
	  }

  public void ReciboAdiantamentoJasper (DuplicataPesquisaED ed) throws Exception {
	    this.inicioTransacao ();
	    try {
	      new DuplicataRelBD (this.sql).ReciboAdiantamentoJasper(ed);

	    }
	    finally {
	      this.fimTransacao (false);
	    }
	  }

  public byte[] geraProtocolo_Cobranca (DuplicataED ed) throws Excecoes {

    try {
      this.inicioTransacao ();
      return new DuplicataRelBD (this.sql).geraProtocolo_Cobranca (ed);
    }
    finally {
      this.fimTransacao (false);
    }
  }

  protected void finalize () throws Throwable {
    if (this.sql != null) {
      this.abortaTransacao ();
    }
  }

  public byte[] geraRelTitEDI (DuplicataED ed) throws Excecoes {

    try {
      this.inicioTransacao ();
      return new DuplicataRelBD (this.sql).geraRelTitEDI (ed);
    }
    finally {
      this.fimTransacao (false);
    }
  }

  public void geraDiario_Razao_Clientes (DuplicataED ed , HttpServletResponse response) throws Excecoes {

    try {
      this.inicioTransacao ();
      new DuplicataRelBD (this.sql).geraDiario_Razao_Clientes (ed , response);
      this.fimTransacao (true);
    }
    catch (Excecoes exc) {
      this.abortaTransacao ();
      throw exc;
    }
    catch (RuntimeException e) {
      this.abortaTransacao ();
      throw e;
    }
  }
}
